#ifndef __BSP_TIMER_H
#define __BSP_TIMER_H

#include "stm32f1xx_hal.h" 
//#include "FreeRTOS.h"
#include <stdbool.h>

//#define USE_DWT_DELAY  1  /* 使用DWT内核精确延时 */
//#define USE_OS_DELAY   1  /* 启用OS时基 */
#define USE_UWTICK_DELAY 1  /* 启用UWTICK时基 */

#if USE_DWT_DELAY
#define USE_TICK_DELAY  0  /* 不使用SysTick延时 */
#else
#define USE_TICK_DELAY  1  /* 使用SysTick延时 */
#endif

/* 获取内核时钟频率 */
#define GET_CPU_ClkFreq()       (SystemCoreClock)

/* DWT相关寄存器宏定义 */
#if USE_DWT_DELAY
#define DWT_CR      *(__IO uint32_t *)0xE0001000
#define DWT_CYCCNT  *(__IO uint32_t *)0xE0001004
#define DEM_CR      *(__IO uint32_t *)0xE000EDFC
#define DEM_CR_TRCENA    (1 << 24)
#define DWT_CR_CYCCNTENA (1 <<  0)
#endif

/* 定义系统超时状态枚举 */
typedef enum {
    NotTimeOut = 0,
    TimeOut = !NotTimeOut
} SystemTimeOutState;

/* 统一的时间结构体 */
typedef struct {
    uint32_t Time_mSec;     /* 毫秒 */
    uint32_t Time_Sec;      /* 秒 */
    uint32_t Time_Min;      /* 分钟 */
    uint32_t Time_us;       /* 微秒（仅适用于DWT） */
} SystemTimeStruct;

/* 系统时间管理的初始化函数 */
void Timer_Init(void);

/* 时间基来源相关函数 */
#if USE_DWT_DELAY
void DWT_Init(void);  // 初始化DWT
void DWT_Delay_US(uint32_t us);  // 微秒级延时
uint32_t DWT_GetElapsedUS(void);  // 获取DWT时间（微秒）
#endif

#if USE_OS_DELAY
void OS_UpdateSystemTime(void);  // 更新OS系统时间
#endif

#if USE_UWTICK_DELAY
void UWTICK_UpdateSystemTime(void);  // 更新UWTICK系统时间
#endif

/* 统一的时间管理相关函数 */
SystemTimeStruct GetSystemTime(void);  // 获取系统时间
uint32_t GetTimeInterval(SystemTimeStruct *last_time);  // 计算时间间隔
void ResetTimeout(SystemTimeStruct *time_struct);  // 重置超时检测结构体
SystemTimeOutState SingleTimeoutCheck(SystemTimeStruct time_struct, uint32_t min, uint32_t sec, uint16_t ms);  // 单次超时检测
SystemTimeOutState MultipleTimeoutCheck(SystemTimeStruct *time_struct, uint32_t min, uint32_t sec, uint16_t ms);  // 连续超时检测

#endif /* __BSP_TIMER_H */
